package com.cn.api.util; /**
 * @author: yihanyuan
 * @Description：
 * @Date: 2019/3/12 15:23
 */

import org.junit.Test;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @program: demo
 * @description:
 * @author: yihanyuan
 * @create: 2019-03-12 15:23
 **/
public class test6 {
    /**
     * @return
     * @description 传入最多可买件数的list，依次循环取出数组
     * @author YiHanYuan
     * @params
     * @date 2019/3/27 10:34
     **/
    public static String multiRound(List<Integer> dataList, String temp, int index) {
        if (index >= dataList.size()) {
            return "";
        }
        StringBuffer out = new StringBuffer();
        String tmp = "";
        //对第一个list进行遍历
        for (int i = 0; i <= dataList.get(index); i++) {
            tmp = i + "/";
            if (index < dataList.size()) {
//取出第一个list中的参数进行拼接，进入下面的循环，取出第二个list，以此继续循环至最后一个list中的最后一个参数，然后再取出第二个参数，继续循环
                out.append(multiRound(dataList, temp + tmp, index + 1));
//                out.append(multiRound(dataList, temp + "  " + index, index + 1));
            }
            //判断是否已经完了一个回合，完了就加入到集合中
            if (index == dataList.size() - 1) {
                out.append(temp).append(tmp).append("\n");
            }
        }
        return out.toString();
    }

    public void count(List<BigDecimal> list, BigDecimal count) {
        BigDecimal low = list.stream().min((x1, x2) -> x1.compareTo(x2)).get();
        System.out.println("传入参数");
        list.stream().forEach(System.out::println);
        System.out.println("每个商品可购买的最多件数");
        //计算每个商品最多可以买多少件划算，第一个参数保存最多多少件，第二个参数保存购买后的价格
        List<BigDecimal[]> all = new ArrayList<>();
        //对价格排序
        List<BigDecimal> sort = list.stream().sorted().collect(Collectors.toList());
        sort.stream().forEach((x) -> {
            Integer max = (count.intValue() % x.intValue() == 0 ? count.intValue() / x.intValue() : count.intValue() / x.intValue() + 1);
            BigDecimal[] b = {BigDecimal.valueOf(max), x.multiply(BigDecimal.valueOf(max))};
            all.add(b);
            System.out.println("价格为  " + x + "  可以买  " + max + "  件,总价为" + x.multiply(BigDecimal.valueOf(max)));
        });
        //取出话最多钱买的商品的那一个数组，之后凑单价格不能超过这个，超过及作废
        BigDecimal[] maxPrice = all.stream().max((x, y) -> x[1].compareTo(y[1])).get();
        List<List<BigDecimal>> lists = new ArrayList<>();
        BigDecimal[] b = {new BigDecimal(1), new BigDecimal(2)};
        BigDecimal[] b1 = {new BigDecimal(6), new BigDecimal(2)};
        all.add(b);
        all.add(b1);
        all.stream().forEach(x -> {
            List<BigDecimal> l = new ArrayList<>();
            for (int i = 0; i <= x[0].intValue(); i++) {
                l.add(BigDecimal.valueOf(i));
            }
            lists.add(l);
        });
        Long time = System.currentTimeMillis();
        System.out.println(multiRound2(lists, "", 0).split("\n").length);
        System.out.println("原始的-------------``" + (System.currentTimeMillis() - time));
    }

    @Test
    public void test22() {
        BigDecimal i1 = new BigDecimal("20");
        BigDecimal i2 = new BigDecimal("48");
        BigDecimal i3 = new BigDecimal("29.9");
        BigDecimal i4 = new BigDecimal("25");
        //满减价格
        BigDecimal count = new BigDecimal("90");
        List<BigDecimal> list = new ArrayList<>();
        list.add(i1);
        list.add(i2);
        list.add(i3);
        list.add(i4);
        Integer[] i = {5, 4, 4, 2, 1, 6};
        count(list, count);
        Long time2 = System.currentTimeMillis();
        System.out.println(multiRound(Arrays.asList(i), "", 0).split("\n").length);
        System.out.println("改进的-------------``" + (System.currentTimeMillis() - time2));

    }


    public static String multiRound2(List<List<BigDecimal>> dataList, String temp, int index) {
        if (index >= dataList.size()) {
            return "";
        }
        StringBuffer out = new StringBuffer();
        String tmp = "";
        //取出第一个list
        List<BigDecimal> data = dataList.get(index);
        //对第一个list进行遍历
        for (int i = 0; i < data.size(); i++) {
            tmp = data.get(i) + "/";
            if (index < dataList.size()) {
//取出第一个list中的参数进行拼接，进入下面的循环，取出第二个list，以此继续循环至最后一个list中的最后一个参数，然后再取出第二个参数，继续循环
                out.append(multiRound2(dataList, temp + tmp, index + 1));
//                out.append(multiRound(dataList, temp + "  " + index, index + 1));
            }
            //判断是否已经完了一个回合，完了就加入到集合中
            if (index == dataList.size() - 1) {
                out.append(temp).append(tmp).append("\n");
            }
        }
        return out.toString();
    }
}
